#include "seg_led.h"

#if (CONFIG_USING_SEG_LED == 1)

static uint8_t user_value[USER_VALUE_NUM];

static code uint8_t _7seg_array[10] = {
    0x3F, // 00111111 0
    0x06, // 00000110 1
    0x5B, // 01011011 2
    0x4F, // 01001111 3
    0x66, // 01100110 4
    0x6D, // 01101101 5
    0x7D, // 01111101 6
    0x07, // 00000111 7
    0x7F, // 01111111 8
    0x6F, // 01101111 9
};

void seg_init(void)
{
    t0_init();
    
    SEG_1_INIT;
    SEG_2_INIT;
    SEG_3_INIT;
    SEG_4_INIT;
    SEG_5_INIT;
#if(SEG_NUM > 5)
    SEG_6_INIT;
#endif
#if(SEG_NUM > 6)
    SEG_7_INIT;
#endif
    
    SEG_START();
}

void seg_exit(void)
{
    SEG_1_OFF;
    SEG_2_OFF;
    SEG_3_OFF;
    SEG_4_OFF;
    SEG_5_OFF;
#if(SEG_NUM > 5)
    SEG_6_OFF;
#endif
#if(SEG_NUM > 6)
    SEG_7_OFF;
#endif

    seg_display(0 , SEG_OFF_ALL);
}

static void scan_init(void)
{
    SEG_1_IN;
    SEG_2_IN;
    SEG_3_IN;
    SEG_4_IN;
    SEG_5_IN;
#if(SEG_NUM > 5)
    SEG_6_IN;
#endif
#if(SEG_NUM > 6)
    SEG_7_IN;
#endif
}

void seg_on_all(void){
    uint8_t i;
    for(i = 0; i < USER_VALUE_NUM; i++){
        user_value[i] = 0xFF;
    }
}

void seg_off_all(void){
    uint8_t i;
    for(i = 0; i < USER_VALUE_NUM; i++){
        user_value[i] = 0;
    }
}

void seg_display(uint8_t value, uint16_t type)
{
    uint8_t num1, num2, num3;
    uint8_t tmp_value_0 = 0, tmp_value_1 = 0, tmp_value_2 = 0;
#if(USER_VALUE_NUM > 3)
    uint8_t tmp_value_3 = 0;
#endif

    if (type & SEG_ON_ALL) {
        seg_on_all();
        return;
    }

    if (type & SEG_OFF_ALL) {
        seg_off_all();
        return;
    }
    
    num1 = value / 100;
    num2 = (value % 100) / 10;
    num3 = value % 10;

    if (value > 9) {
        tmp_value_0 |= _7seg_array[num2] | (num1 << 7);
    }
    tmp_value_1 |= _7seg_array[num3] | (num1 << 7);
        
    tmp_value_2 = type & 0xff;
#if(USER_VALUE_NUM > 3)
    tmp_value_3 = (type >> 8) & 0xff;
#endif

    user_value[0] = tmp_value_0;
    user_value[1] = tmp_value_1;
    user_value[2] = tmp_value_2;
#if(USER_VALUE_NUM > 3)
    user_value[3] = tmp_value_3;
#endif
}

void seg_scan_loop(void)
{
    static uint8_t number;

    switch (number) {
        case 0 : 
            SEG_1_OFF;
            if (user_value[0] & BIT2) {SEG_2_ON;}
            if (user_value[0] & BIT3) {SEG_3_ON;}
            if (user_value[0] & BIT4) {SEG_4_ON;}
            if (user_value[0] & BIT5) {SEG_5_ON;}
            break;
        case 1 : 
            SEG_2_OFF;
            if (user_value[1] & BIT0) {SEG_1_ON;}
            if (user_value[1] & BIT1) {SEG_3_ON;}
            if (user_value[1] & BIT2) {SEG_4_ON;}
            if (user_value[1] & BIT3) {SEG_5_ON;}
            break;
        case 2 :
            SEG_3_OFF;
            if (user_value[1] & BIT6) {SEG_1_ON;}
            if (user_value[1] & BIT7) {SEG_2_ON;}
            if (user_value[2] & BIT2) {SEG_4_ON;}
            if (user_value[2] & BIT3) {SEG_5_ON;}
            break;
        case 3 :
            SEG_4_OFF;
            if (user_value[2] & BIT6) {SEG_1_ON;}
            if (user_value[2] & BIT7) {SEG_2_ON;}
            if (user_value[3] & BIT0) {SEG_3_ON;}
            if (user_value[3] & BIT1) {SEG_5_ON;}
            break;
        case 4 :
            SEG_5_OFF;
            if (user_value[3] & BIT4) {SEG_1_ON;}
            if (user_value[3] & BIT5) {SEG_2_ON;}
            if (user_value[3] & BIT6) {SEG_3_ON;}
            if (user_value[3] & BIT7) {SEG_4_ON;}
            break;
        default :
            break;
    }
    
    if (number < 4) {
        number++;
    } else {
        number = 0;
    }
}

void timer0_ISR(void) interrupt 0  //1ms ɨ���ж�
{
    scan_init();
    seg_scan_loop();
    
    TPENDING = 0x01;
}

#endif